package br.com.foxinline.manager.editar;

import br.com.foxinline.enums.*;
import br.com.foxinline.manager.criar.ManagerCriarImovel;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.util.ArquivoUtilitario;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.Conexao;
import br.com.foxinline.util.CoordinateConversion;
import br.com.foxinline.util.Msg;
import java.beans.Transient;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.event.map.StateChangeEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;
import org.primefaces.model.map.Polygon;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerEditarImovel implements Serializable {

    @EJB
    ImovelServico imovelServico;
    @EJB
    ProprietarioServico proprietarioServico;
    @EJB
    CoordenadaServico coordenadaService;
    @EJB
    AnexoServico anexoServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    BairroServico bairroServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    PrefeituraServico prefeituraServico;
    @EJB
    DneServico dneServico;
    @EJB
    FaceQuadraServico faceQuadraServico;
    // Imóvel
    private Proprietario proprietario;
    private String eImovel;
    private Imovel imovel;
    // Georreferenciamento
    private LatLng latlong;
    private Coordenada coordenada;
    private Coordenada coordenadaRemover;
    private MapModel mapModel;
    private MapModel mapModelDimensao;
    private String convN;
    private String convE;
    private String convZona;
    private Coordenada editarCoordenada;
    private Coordenada visualizarCoordenada;
    //Composição Familiar
    private Proprietario morador;
    private Proprietario inquilino;
    private int moradoresInicio;
    private int moradoresFim;
    private boolean disableInputsMorador;
    private boolean disableEnderecoImovel;
    private boolean disableEnderecoCorrespondencia = false;
    private String visaoInscricao = "";
    private String center;
    private Integer zoom;
    private String centerDimensao;
    private Integer zoomDimensao;
    private boolean usarMesmoEndereco;
    //Anexo
    private Anexo annexCroqui;
    private List<Anexo> annexCroquis;
    private List<Anexo> anexosRemover;
    private ArquivoUtilitario arquivoUtilitario;
    public boolean connect;
    private Anexo anexo;
    private Anexo removerCroqui;
    private Proprietario proprietarioVisualizar;
    private String ladoEsquerdo;
    private String ladoDireito;
    private int indexAnexo;
    private String frente;
    private Endereco endPropNovo;
    private boolean endPropChange;
    private List<Proprietario> proprietariosSelected;
    private Polygon polygon;
    private boolean editandoCoordenada;
    private boolean panelCollapsed;
    private FaceQuadra faceQuadra;
    private Bairro bairro;

    @PostConstruct
    public void init() {
        this.imovel = new Imovel();

        this.proprietario = new Proprietario();
        this.proprietario.setTipoDocumento(TipoDocumento.CPF);

        this.proprietarioVisualizar = new Proprietario();
        this.proprietarioVisualizar.setTipoDocumento(TipoDocumento.CPF);

        this.coordenada = new Coordenada();

        this.morador = new Proprietario();
        this.inquilino = new Proprietario();
        this.arquivoUtilitario = new ArquivoUtilitario();

        this.anexo = new Anexo();

        this.endPropNovo = new Endereco();
        this.endPropChange = false;

        this.faceQuadra = new FaceQuadra();

        this.mapModelDimensao = new DefaultMapModel();
        this.polygon = new Polygon();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.eImovel = params.get("eImovel");
        paramPost();

        this.anexosRemover = new ArrayList<Anexo>();

        this.center = prefeituraServico.getCentroMapa();
        this.zoom = prefeituraServico.getZoomMapa();

        this.centerDimensao = prefeituraServico.getCentroMapa();
        this.zoomDimensao = prefeituraServico.getZoomMapa();

        if (prefeituraServico.find().getDesabilitarMapas()) {

            this.connect = false;
        } else if (!Conexao.isInternetReachable()) {

            this.connect = false;
            Msg.messagemWarn("Não foi possível estabelecer uma conexão com a Internet.");
        } else {
            this.connect = true;
            plotar();
            plotarCoordenadasDimensoes();
        }

        this.panelCollapsed = true;
    }

    public void plotar() {
        this.mapModel = new DefaultMapModel();
        LatLng coord;
        if (!this.imovel.getCoordenadas().isEmpty()) {
            for (Coordenada c : this.imovel.getCoordenadas()) {
                coord = new LatLng(c.getLat(), c.getLog());
                this.center = c.getLat() + ", " + c.getLog();
                Marker marker = new Marker(coord, "", null, getRequestURL().concat("/media/images/imovel.png"));

                if (this.imovel.getProprietarios() == null || this.imovel.getProprietarios().isEmpty()) {
                    marker.setTitle("Não existe(m) proprietário(s)");
                } else {

                    for (Proprietario p : this.imovel.getProprietarios()) {
                        marker.setTitle(marker.getTitle() + ", " + p.getNome());
                    }
                }

                marker.setDraggable(true);
                this.mapModel.addOverlay(marker);
            }
            this.zoom = 17;
        }
    }

    public void plotarCoordenadasDimensoes() {
        this.mapModelDimensao = new DefaultMapModel();
        this.polygon = new Polygon();

        LatLng coord;

        if (!this.imovel.getCoordenadasDimensoes().isEmpty()) {

            Marker marker;

            this.imovel.setCoordenadasDimensoes(imovelServico.lstCoordenadasDimensoes(this.imovel));

            for (Coordenada c : this.imovel.getCoordenadasDimensoes()) {
                coord = new LatLng(c.getLat(), c.getLog());

                this.centerDimensao = c.getLat() + ", " + c.getLog();

                if (c.getPonto() == null || c.getPonto().isEmpty()) {
                    c.setPonto("" + (this.imovel.getCoordenadasDimensoes().indexOf(c) + 1));
                }

                marker = new Marker(coord, c.getPonto(), c);
                marker.setData(c);
                marker.setDraggable(true);

                this.mapModelDimensao.addOverlay(marker);

                this.polygon.getPaths().add(coord);
                this.polygon.setStrokeColor("#FF9900");
                this.polygon.setFillColor("#FF9900");
                this.polygon.setFillOpacity(0);

                this.mapModelDimensao.addOverlay(this.polygon);
            }

            this.mapModelDimensao.addOverlay(this.polygon);
        } else {
            Marker marker;

            if (this.imovel.getCoordenadasDimensoes() == null) {
                this.imovel.setCoordenadasDimensoes(new ArrayList<Coordenada>());
            }

            for (Coordenada c : this.imovel.getCoordenadas()) {

                if (c.getPonto() == null || c.getPonto().isEmpty()) {
                    c.setPonto("" + (this.imovel.getCoordenadasDimensoes().indexOf(c) + 1));
                }

                this.imovel.getCoordenadasDimensoes().add(c);

                coord = new LatLng(c.getLat(), c.getLog());

                this.centerDimensao = c.getLat() + ", " + c.getLog();


                marker = new Marker(coord, c.getPonto(), c);
                marker.setData(c);
                marker.setDraggable(true);

                this.mapModelDimensao.addOverlay(marker);

                this.polygon.getPaths().add(coord);
                this.polygon.setStrokeColor("#FF9900");
                this.polygon.setFillColor("#FF9900");
                this.polygon.setFillOpacity(0);

                this.mapModelDimensao.addOverlay(this.polygon);
            }

            this.mapModelDimensao.addOverlay(this.polygon);

        }

        this.zoomDimensao = 17;

        for (Marker premarker : this.mapModelDimensao.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    @Transient
    private String getRequestURL() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        String requestURL = request.getRequestURL().toString();
        String url = requestURL.substring(0, requestURL.lastIndexOf("/"));
        return url;
    }

    public void adicionarCoordenada() {

        if (!validarCoordenada()) {
            return;
        }

        if (this.editandoCoordenada) {
            this.imovel.getCoordenadasDimensoes().add(this.coordenada);

            String lat = this.coordenada.getConvN();
            String lon = 24 + this.coordenada.getConvE();
            String zona = this.convZona;

            lat = lat.replace(" ", "");
            lon = lon.replace(" ", "");

            if (zona == null) {
                zona = "M";
            }

            CoordinateConversion cc = new CoordinateConversion();

            String UTM = lon.toString().substring(0, 2) + " " + zona + " " + lon.toString().substring(2) + " " + lat.toString();

            this.coordenada.setLat(cc.utm2LatLon(UTM)[0]);
            this.coordenada.setLog(cc.utm2LatLon(UTM)[1]);

            LatLng latLng = new LatLng(this.coordenada.getLat(), this.coordenada.getLog());

            Marker marker = new Marker(latLng, this.coordenada.getPonto(), this.editarCoordenada);

            for (Marker m : this.mapModelDimensao.getMarkers()) {
                if (m.getData().equals(this.editarCoordenada)) {
                    marker = m;
                    m.setLatlng(latLng);
                }
            }

            atualizarMarkerCoordenadaDimensao(marker);

        } else {

            try {

                String lat = this.coordenada.getConvN();
                String lon = 24 + this.coordenada.getConvE();
                String zona = this.convZona;

                lat = lat.replace(" ", "");
                lon = lon.replace(" ", "");

                if (zona == null) {
                    zona = "M";
                }

                CoordinateConversion cc = new CoordinateConversion();

                String UTM = lon.toString().substring(0, 2) + " " + zona + " " + lon.toString().substring(2) + " " + lat.toString();

                this.coordenada.setLat(cc.utm2LatLon(UTM)[0]);
                this.coordenada.setLog(cc.utm2LatLon(UTM)[1]);
                this.coordenada.setConvZona(zona);

                this.imovel.getCoordenadasDimensoes().add(this.coordenada);


            } catch (Exception e) {
                System.err.println(e);
                Msg.messagemError("Valores Incorretos(COORDENADA)");
            }
        }

        RequestContext.getCurrentInstance().update("realtyForm:tabView:georefPanel");
        RequestContext.getCurrentInstance().update("realtyForm:tabView:georefCoordenadasPanel");
        RequestContext.getCurrentInstance().update("realtyForm:tabView:coordenadaAvancadoDados");

        this.editandoCoordenada = false;
        this.coordenada = new Coordenada();
        this.editarCoordenada = new Coordenada();

        this.panelCollapsed = true;

        plotarCoordenadasDimensoes();
    }

    private Coordenada obterCoordenadaCompleta(Coordenada c) {

        try {
            Double lat = c.getLat();
            Double lon = c.getLog();

            CoordinateConversion cc = new CoordinateConversion();

            String utm = cc.latLon2UTM(lat, lon);

            c.setConvE(utm.split(" ")[2]);
            c.setConvN(utm.split(" ")[3]);

            return c;

        } catch (Exception e) {
            return null;
        }
    }

    public void editarCoordenada(Coordenada c) {

        this.coordenada = c.getClone();
        this.editarCoordenada = c;

        this.imovel.getCoordenadasDimensoes().remove(c);
        this.editandoCoordenada = true;
        this.panelCollapsed = false;
    }

    public void cancelarEditarCoordenada() {
        this.imovel.getCoordenadasDimensoes().add(this.coordenada);
        this.editandoCoordenada = false;
        this.panelCollapsed = true;
    }

    public void removerPontosCoordenadaDimensao() {
        this.imovel.setCoordenadasDimensoes(new ArrayList<Coordenada>());
        this.mapModelDimensao = new DefaultMapModel();
        this.coordenada = new Coordenada();
        this.editandoCoordenada = false;
        this.panelCollapsed = true;
        this.polygon = new Polygon();

        plotarCoordenadasDimensoes();
    }

    public void removerCoordenadaDimensao() {
        this.imovel.getCoordenadasDimensoes().remove(this.coordenadaRemover);
        this.coordenadaRemover = new Coordenada();

        plotarCoordenadasDimensoes();
    }

    public void visualizarCoordenada(Coordenada c) {
        this.visualizarCoordenada = c;
    }

    public void visualizarCoordenadaMapa(OverlaySelectEvent event) {
        this.visualizarCoordenada = (Coordenada) ((Marker) event.getOverlay()).getData();
    }

    public void fecharDialogCoordenada() {
        this.editarCoordenada = new Coordenada();
    }

    public void onMarkerDrag(MarkerDragEvent event) {
        Marker marker = event.getMarker();

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Coordenadas Alteradas", ""));


        if (this.imovel.getCoordenadas().get(0) != null) {
            try {

                CoordinateConversion cc = new CoordinateConversion();

                this.imovel.getCoordenadas().get(0).setLat(marker.getLatlng().getLat());
                this.imovel.getCoordenadas().get(0).setLog(marker.getLatlng().getLng());

                String str = cc.latLon2UTM(this.imovel.getCoordenadas().get(0).getLat(), this.imovel.getCoordenadas().get(0).getLog());

                this.imovel.getCoordenadas().get(0).setConvE("24" + str.split(" ")[2]);
                this.imovel.getCoordenadas().get(0).setConvN(str.split(" ")[3]);

                this.center = event.getMarker().getLatlng().getLat() + ", " + event.getMarker().getLatlng().getLng();

                coordenadaService.update(this.imovel.getCoordenadas().get(0));

                this.imovel.setCoordenadas(imovelServico.lstCoordenadas(this.imovel));

            } catch (Exception e) {
                System.err.println(e);
                Msg.messagemError("Valores Incorretos(COORDENADA)");
            }
        }
    }

    public void onMarkerDragDimensao(MarkerDragEvent event) {

        Marker marker = event.getMarker();

        int index = this.imovel.getCoordenadasDimensoes().indexOf((Coordenada) marker.getData());

        Coordenada c = this.imovel.getCoordenadasDimensoes().get(index);

        c.setLat(marker.getLatlng().getLat());
        c.setLog(marker.getLatlng().getLng());

        c = obterCoordenadaCompleta(c);

        this.imovel.getCoordenadasDimensoes().set(index, c);
        marker.setData(c);

        atualizarMarkerCoordenadaDimensao(marker);
    }

    public void onStateChange(StateChangeEvent event) {
        this.zoom = event.getZoomLevel();
        this.center = event.getCenter().getLat() + ", " + event.getCenter().getLng();
    }

    public void onStateChangeDimensao(StateChangeEvent event) {
        this.zoomDimensao = event.getZoomLevel();
        this.centerDimensao = event.getCenter().getLat() + ", " + event.getCenter().getLng();
    }

    public void handlePointClick(PointSelectEvent event) {

        if (this.imovel.getCoordenadas() != null && this.imovel.getCoordenadas().isEmpty()) {

            LatLng latLng = event.getLatLng();

            this.mapModel.addOverlay(new Marker(latLng, ""));

            for (Marker premarker : this.mapModel.getMarkers()) {
                premarker.setDraggable(true);
            }
            this.coordenada = coordenadaLatLon2UTM(latLng);

            this.imovel.getCoordenadas().add(this.coordenada);
        }
    }

    public void handlePointClickDimensao(PointSelectEvent event) {

        LatLng latLng = event.getLatLng();

        Coordenada coord = coordenadaLatLon2UTM(latLng);
        coord.setPonto("" + (this.imovel.getCoordenadasDimensoes().size() + 1));

        this.imovel.getCoordenadasDimensoes().add(coord);

        Marker marker = new Marker(latLng, coord.getPonto());
        marker.setData(coord);

        addOverlayToMapModel(marker);

        this.mapModelDimensao.addOverlay(this.polygon);

        for (Marker premarker : this.mapModelDimensao.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    /**
     * Converte a latitude e longitude em UTM e seta os respectivos campos da
     * coordenada (convN, convE e convZona, alem de lat e log)
     *
     * @param latLng
     * @return
     */
    private Coordenada coordenadaLatLon2UTM(LatLng latLng) {
        Coordenada newCoordenada = new Coordenada();
        newCoordenada.setLat(latLng.getLat());
        newCoordenada.setLog(latLng.getLng());

        CoordinateConversion cc = new CoordinateConversion();
        String utm = cc.latLon2UTM(newCoordenada.getLat(), newCoordenada.getLog());

        String[] utmZonaLngLat = utm.split(" ");

        newCoordenada.setConvN(utmZonaLngLat[3]);
        newCoordenada.setConvE(utmZonaLngLat[2]);

        newCoordenada.setConvZona(utmZonaLngLat[1]);

        return newCoordenada;
    }

    private void addOverlayToMapModel(Marker marker) {
        this.mapModelDimensao.addOverlay(marker);
        this.polygon.getPaths().add(marker.getLatlng());
        this.polygon.setStrokeColor("#FF9900");
        this.polygon.setFillColor("#FF9900");
        this.polygon.setFillOpacity(0.1);
    }

    public void adicionarMorador() {
        if (this.imovel.getMoradores().size() < this.moradoresFim) {
            if (this.morador.getNome() == null || this.morador.getNome().equals("")) {
                Msg.messagemError("O campo Nome é obrigatório !");
                return;
            }
            this.imovel.getMoradores().add(this.morador);
            this.morador = new Proprietario();
        }
    }

    public void editarMorador(int id, Proprietario morador) {
        this.morador = morador;
        removerMorador(id);
    }

    public void removerMorador(int id) {
        this.imovel.getMoradores().remove(id);
        this.disableInputsMorador = false;
    }

    public void removerCoordenada() {
        this.imovel.getCoordenadas().clear();

        plotar();
    }

    public void paramPost() {
        try {
            if (this.eImovel != null) {

                this.imovel = imovelServico.find(Long.parseLong(this.eImovel));

                if (this.imovel.getProprietarios() != null && !this.imovel.getProprietarios().isEmpty()) {
                    this.imovel.setProprietarios(imovelServico.lstProprietario(this.imovel));
                } else {
                    this.imovel.setProprietarios(new ArrayList<Proprietario>());
                }

                if (this.imovel.getCoordenadas() != null && !this.imovel.getCoordenadas().isEmpty()) {
                    this.imovel.setCoordenadas(imovelServico.lstCoordenadas(this.imovel));
                } else {
                    this.imovel.setCoordenadas(new ArrayList<Coordenada>());
                }

                if (this.imovel.getCoordenadasDimensoes() != null && !this.imovel.getCoordenadasDimensoes().isEmpty()) {
                    this.imovel.setCoordenadasDimensoes(imovelServico.lstCoordenadasDimensoes(this.imovel));
                } else {
                    this.imovel.setCoordenadasDimensoes(new ArrayList<Coordenada>());
                }

                if (this.imovel.getAnnex() != null && !this.imovel.getAnnex().isEmpty()) {
                    this.imovel.setAnnex(imovelServico.lstAnnexs(this.imovel));
                } else {
                    this.imovel.setAnnex(new ArrayList<Anexo>());
                }

                if (this.imovel.getAnnexCroquis() != null && !this.imovel.getAnnexCroquis().isEmpty()) {
                    this.annexCroquis = imovelServico.lstAnnexCroqui(this.imovel);
                } else {
                    this.annexCroquis = new ArrayList<Anexo>();
                }

                if (this.imovel.getEnderecoImovel() == null) {
                    this.imovel.setEnderecoImovel(new Endereco());
                } else {
                    this.imovel.setEnderecoImovel(enderecoServico.find(this.imovel.getEnderecoImovel().getId()));
                }

                if (this.imovel.getEnderecoCorrespondencia() == null) {
                    this.imovel.setEnderecoCorrespondencia(new Endereco());
                } else {
                    this.imovel.setEnderecoCorrespondencia(enderecoServico.find(this.imovel.getEnderecoCorrespondencia().getId()));
                }

                if (this.imovel.getEnderecoImovel().getCep() != null && !this.imovel.getEnderecoImovel().getCep().equals("")) {
                    this.disableEnderecoImovel = true;
                } else {
                    this.disableEnderecoImovel = false;
                }

                if (this.imovel.getEnderecoCorrespondencia().getCep() != null && !this.imovel.getEnderecoCorrespondencia().getCep().equals("")) {
                    this.disableEnderecoCorrespondencia = true;
                } else {
                    this.disableEnderecoCorrespondencia = false;
                }

                if (this.imovel.getEnderecoImovel() != null && this.imovel.getEnderecoCorrespondencia() != null
                        && this.imovel.getEnderecoImovel().getCep() != null && this.imovel.getEnderecoCorrespondencia().getCep() != null
                        && this.imovel.getEnderecoImovel().getCep().equals(this.imovel.getEnderecoCorrespondencia().getCep())) {

                    this.imovel.getEnderecoCorrespondencia().setNumero(this.imovel.getEnderecoImovel().getNumero());
                    this.imovel.getEnderecoCorrespondencia().setCompl(this.imovel.getEnderecoImovel().getCompl());
                    this.usarMesmoEndereco = true;
                }

                if (this.imovel.getDimensoes() == null) {
                    this.imovel.setDimensoes(new Dimensao());
                }

                List<Proprietario> moradores = this.imovel.getMoradores();
                this.imovel.setMoradores(moradores);

                DecimalFormat d = new DecimalFormat("");
                d.setMinimumIntegerDigits(2);

                this.visaoInscricao += d.format(this.imovel.getInscricaoCadastralD() == null ? 0 : this.imovel.getInscricaoCadastralD());
                this.visaoInscricao += d.format(this.imovel.getInscricaoCadastralS() == null ? 0 : this.imovel.getInscricaoCadastralS());
                d.setMinimumIntegerDigits(3);
                this.visaoInscricao += d.format(this.imovel.getInscricaoCadastralQuadra() == null ? 0 : this.imovel.getInscricaoCadastralQuadra());
                d.setMinimumIntegerDigits(4);
                d.setDecimalSeparatorAlwaysShown(false);
                this.visaoInscricao += d.format(this.imovel.getInscricaoCadastralLote() == null ? 0 : this.imovel.getInscricaoCadastralLote());
                d.setMinimumIntegerDigits(2);
                this.visaoInscricao += d.format(this.imovel.getInscricaoCadastralUnid() == null ? 0 : this.imovel.getInscricaoCadastralUnid());

                this.frente = imovel.getEnderecoImovel().getLogradouro();
                this.ladoEsquerdo = imovelServico.confrontanteLadoEsquerdo(this.imovel);
                this.ladoDireito = imovelServico.confrontanteLadoDireito(this.imovel);
            }
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    public void atualizar() {

//        if (!endPropChange && !this.editImovel.getProprietarios().isEmpty() && enderecoPreenchido(this.editImovel.getEnderecoImovel())) {
//            endPropNovo = this.editImovel.getEnderecoImovel();
//            this.proprietariosSelected = new ArrayList(this.editImovel.getProprietarios());
//            List<Proprietario> aux = new ArrayList<Proprietario>();
//
//            for (Proprietario p : proprietariosSelected) {
//                if (p.getEndereco() == null) {
//                    continue;
//                } else if (p.getEndereco() != null && enderecoIgual(p.getEndereco(), endPropNovo)) {
//                    aux.add(p);
//                }
//            }
//            this.proprietariosSelected.removeAll(aux);
//
//            if (!this.proprietariosSelected.isEmpty()) {
//                RequestContext.getCurrentInstance().execute("enderecoChangeDlg.show()");
//                return;
//            }
//        }

        if (proprietariosSelected != null) {
            for (Proprietario p : proprietariosSelected) {
                this.imovel.getProprietarios().set(this.imovel.getProprietarios().indexOf(p), p);
            }
        }

        try {
            String[] str = visaoInscricao.split("\\.");
            this.imovel.setInscricaoCadastralD(Integer.parseInt(str[0]));
            this.imovel.setInscricaoCadastralS(Integer.parseInt(str[1]));
            this.imovel.setInscricaoCadastralQuadra(Integer.parseInt(str[2]));
            this.imovel.setInscricaoCadastralLote(Integer.parseInt(str[3]));
            this.imovel.setInscricaoCadastralUnid(Integer.parseInt(str[4]));

        } catch (Exception e) {

            System.err.println(e);
        }
        try {
            for (Proprietario pro : this.imovel.getProprietarios()) {
                if (pro.getId() == null) {
                    proprietarioServico.salvar(pro);
                } else {
                    proprietarioServico.update(pro);
                }
            }

            for (Proprietario morad : this.imovel.getMoradores()) {
                morad.setTipoDocumento(TipoDocumento.CPF);
                if (morad.getId() == null) {
                    proprietarioServico.salvar(morad);
                }
            }

            if (this.imovel.getAnnex().isEmpty()) {
                this.imovel.setAnnex(null);
            }

            if (!this.annexCroquis.isEmpty()) {
                this.imovel.setAnnexCroquis(this.annexCroquis);
            } else {
                this.imovel.setAnnexCroquis(null);
            }

            if (!this.anexosRemover.isEmpty()) {
                anexoServico.delete(this.anexosRemover);
            }

            if (this.imovel.getEnderecoImovel() != null) {
                if (this.imovel.getEnderecoImovel().getCep() != null && !this.imovel.getEnderecoImovel().getCep().equals("")) {
                    this.imovel.getEnderecoImovel().setCep(Caracter.removecaracter(this.imovel.getEnderecoImovel().getCep()));
                }
            }

            if (this.imovel.getEnderecoCorrespondencia() != null) {
                if (this.imovel.getEnderecoCorrespondencia().getCep() != null && !this.imovel.getEnderecoCorrespondencia().getCep().equals("")) {
                    this.imovel.getEnderecoCorrespondencia().setCep(Caracter.removecaracter(this.imovel.getEnderecoCorrespondencia().getCep()));
                }
            }

            if (this.imovel.getTipoPavimentacao() != null && (this.imovel.getTipoPavimentacao().equals(TipoPavimentacao.ASFALTICA) || this.imovel.getTipoPavimentacao().equals(TipoPavimentacao.POLIEDRICA))) {
                this.imovel.setCalcamento(true);
            }

            imovelServico.update(this.imovel);

            this.imovel = imovelServico.find(this.imovel.getId());
            this.imovel.getAnnex().clear();
            this.imovel.setAnnex(imovelServico.lstAnnexs(this.imovel));
            this.annexCroquis.clear();
            this.annexCroquis = imovelServico.lstAnnexCroqui(this.imovel);

            Proprietario pro;

            for (int i = 0; i < this.imovel.getProprietarios().size(); i++) {

                pro = proprietarioServico.find(this.imovel.getProprietarios().get(i).getId());

                this.imovel.getProprietarios().set(i, pro);
            }

            this.imovel.setCoordenadas(imovelServico.lstCoordenadas(this.imovel));
            this.imovel.setCoordenadasDimensoes(imovelServico.lstCoordenadasDimensoes(this.imovel));
            this.anexosRemover.clear();

            plotar();

            Msg.messagemInfo(Msg.SuccessFull);
            this.endPropChange = false;
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public void eventChangePatrimonioUniao() {
        if (!this.imovel.getPatrimonio().equals(Patrimonio.UNIAO)) {
            this.imovel.setRip(null);
            this.imovel.setRipNomeCadastrado(null);
            this.imovel.setVinculoTitularRip(null);
            this.imovel.setTitularFalecido(null);
        }
    }

    public void removerProprietario(Proprietario p) {
        this.imovel.getProprietarios().remove(p);
    }

    public void addProprietario() {
        if (this.proprietario == null) {
            Msg.messagemError("Selecione um Proprietário");
        } else {
            if (this.imovel.getProprietarios() == null) {
                this.imovel.setProprietarios(new ArrayList<Proprietario>());
            }
            if (!this.imovel.getProprietarios().contains(this.proprietario)) {
                if (this.proprietario.getCpf() != null && !this.proprietario.getCpf().equals("")) {
                    this.proprietario.setCpf(Caracter.removecaracter(this.proprietario.getCpf()));
                }
                if (this.proprietario.getCnpj() != null && !this.proprietario.getCnpj().equals("")) {
                    this.proprietario.setCnpj(Caracter.removecaracter(this.proprietario.getCnpj()));
                }
                if (!this.imovel.getProprietarios().contains(this.proprietario)) {
                    this.imovel.getProprietarios().add(this.proprietario);
                }
            }

            TipoDocumento tipoDocumento = this.proprietario.getTipoDocumento() == null ? TipoDocumento.CPF : this.proprietario.getTipoDocumento();
            this.proprietario = new Proprietario();
            this.proprietario.setTipoDocumento(tipoDocumento);
        }
    }

    public void removerInquilino(Proprietario i) {
        this.imovel.getInquilinos().remove(i);
    }

    public void addInquilino() {
        if (this.inquilino == null) {
            Msg.messagemError("Selecione um Inquilino");
        } else {
            if (this.imovel.getInquilinos() == null) {
                this.imovel.setInquilinos(new ArrayList<Proprietario>());
            }
            if (!this.imovel.getInquilinos().contains(this.inquilino)) {
                if (this.inquilino.getCpf() != null && !this.inquilino.getCpf().equals("")) {
                    this.inquilino.setCpf(Caracter.removecaracter(this.inquilino.getCpf()));
                }
                if (this.inquilino.getCnpj() != null && !this.inquilino.getCnpj().equals("")) {
                    this.inquilino.setCnpj(Caracter.removecaracter(this.inquilino.getCnpj()));
                }
                if (!this.imovel.getInquilinos().contains(this.inquilino)) {
                    this.imovel.getInquilinos().add(this.inquilino);
                }
            }

            TipoDocumento tipoDocumento = this.inquilino.getTipoDocumento() == null ? TipoDocumento.CPF : this.inquilino.getTipoDocumento();
            this.inquilino = new Proprietario();
            this.inquilino.setTipoDocumento(tipoDocumento);
        }
    }

    public void existProprietario() {
        proprietarioServico.removeCaracterDocument(this.proprietario);
        if (this.proprietario.getTipoDocumento() == TipoDocumento.CPF) {
            if (this.proprietario.getCpf().equals("")) {
                this.proprietario = new Proprietario();
                this.proprietario.setTipoDocumento(TipoDocumento.CPF);
            } else {
                this.proprietario = proprietarioServico.existDocuments(this.proprietario);
            }
        } else if (this.proprietario.getTipoDocumento() == TipoDocumento.CNPJ) {
            if (this.proprietario.getCnpj().equals("")) {
                this.proprietario = new Proprietario();
                this.proprietario.setTipoDocumento(TipoDocumento.CNPJ);
            } else {
                this.proprietario = proprietarioServico.existDocuments(this.proprietario);
            }
        }
    }

    public void existeEnderecoImovel() {
        Endereco endereco;
        String num = this.imovel.getEnderecoImovel().getNumero();
        Integer codLogra = this.imovel.getEnderecoImovel().getCodLogradouro();
        Integer codBairro = this.imovel.getEnderecoImovel().getCodBairro();
        String complemento = this.imovel.getEnderecoImovel().getCompl();

        endereco = enderecoServico.existCep(this.imovel.getEnderecoImovel());

        if (endereco != null) {
            this.imovel.setEnderecoImovel(endereco);
            this.imovel.getEnderecoImovel().setNumero(num);
            this.imovel.getEnderecoImovel().setCompl(complemento);
            this.imovel.getEnderecoImovel().setCodLogradouro(codLogra);
            this.imovel.getEnderecoImovel().setCodBairro(codBairro);
            this.disableEnderecoImovel = true;
        } else {
            this.disableEnderecoImovel = false;
        }
    }

    public void existeEnderecoCorrespondencia() {
        Endereco endereco = this.imovel.getEnderecoCorrespondencia();
        String num = endereco.getNumero();
        Integer codLogra = endereco.getCodLogradouro();
        Integer codBairro = endereco.getCodBairro();
        String complemento = endereco.getCompl();

        endereco = enderecoServico.existCep(this.imovel.getEnderecoCorrespondencia());

        if (endereco != null) {
            this.imovel.setEnderecoCorrespondencia(endereco);
            this.imovel.getEnderecoCorrespondencia().setNumero(num);
            this.imovel.getEnderecoCorrespondencia().setCompl(complemento);
            this.imovel.getEnderecoCorrespondencia().setCodLogradouro(codLogra);
            this.imovel.getEnderecoCorrespondencia().setCodBairro(codBairro);
            this.disableEnderecoCorrespondencia = true;
        } else {
            this.disableEnderecoCorrespondencia = false;
        }
    }

    public void usarEnderecoParaCorrespondencia() {
        if (this.usarMesmoEndereco && this.imovel.getEnderecoImovel().getCep() != null
                && !this.imovel.getEnderecoImovel().getCep().equals("")) {
            this.imovel.setEnderecoCorrespondencia(this.imovel.getEnderecoImovel());
        } else {
            this.disableEnderecoCorrespondencia = false;
            this.imovel.setEnderecoCorrespondencia(new Endereco());
        }
    }

    public boolean isDesabilitarEnderecoCorrespondencia() {
        if ((this.usarMesmoEndereco
                && (this.imovel.getEnderecoImovel().getCep() != null && !this.imovel.getEnderecoImovel().getCep().equals("")))
                || this.disableEnderecoCorrespondencia) {
            return true;
        }

        return false;
    }
    private static int tamanhoMaximoNome = 10;

    public void adicionarAnexo(FileUploadEvent event) throws IOException {
        try {
            this.anexo = arquivoUtilitario.adicionarArquivo(event.getFile().getContents(), event.getFile().getFileName(), event.getFile().getContentType());

            RequestContext.getCurrentInstance().execute("dlgAnexo.show()");

        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Remove o anexo da lista de anexos que está sendo adicionado e remove o
     * arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo(Anexo anexo) {
        try {
            this.anexosRemover.add(anexo);
            this.imovel.getAnnex().remove(anexo);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public void handleAnnexCroqui(FileUploadEvent event) throws IOException {
        try {
            Anexo anexoCroqui = arquivoUtilitario.adicionarArquivo(event.getFile().getContents(), event.getFile().getFileName(), event.getFile().getContentType());
            this.annexCroquis.add(anexoCroqui);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Remove o anexo da lista de anexos croquis que está sendo adicionado e
     * remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexoCroqui() {
        try {
            this.anexosRemover.add(this.removerCroqui);
            this.annexCroquis.remove(this.removerCroqui);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public boolean isPessoaFisica() {
        if (proprietarioVisualizar.getTipoDocumento() == null) {
            proprietarioVisualizar.setTipoDocumento(TipoDocumento.CPF);
        }

        return proprietarioVisualizar.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    /**
     * Habilita a edicao do nome e do tipo de anexo
     *
     * @param anexo
     */
    public void editarAnexo(Anexo anexo) {
        this.anexo = anexo;
        this.indexAnexo = this.imovel.getAnnex().indexOf(anexo);
    }

    /**
     * Atualiza o nome de exibição e tipo de anexo do anexo que está sendo
     * editado
     */
    public void atualizarAnexo() {
        this.imovel.getAnnex().get(this.indexAnexo).setNomeExibicao(this.anexo.getNomeExibicao());
        this.imovel.getAnnex().get(this.indexAnexo).setTipoAnexo(this.anexo.getTipoAnexo());
        this.anexo = new Anexo();
    }

    /**
     * Adiciona o anexo (this.anexo) a lista de anexos do imovel
     */
    public void adicionarAnexo() {
        this.imovel.getAnnex().add(this.anexo);
        this.anexo = new Anexo();
    }

    /**
     * Remove o arquivo (this.anexo) do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo() {
        try {
            arquivoUtilitario.excluirArquivo(new File(this.anexo.getUrl() + this.anexo.getNome()));
            this.anexo = new Anexo();
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public void addProprietario(Proprietario p) {
        if (p.getId() != null) {
            if (this.imovel.getProprietarioField() != null) {
                this.imovel.setProprietarios(new ArrayList<Proprietario>());
            }
            this.imovel.getProprietarios().add(p);
        }
    }

    public void alterarEnderecoProprietario() {
        for (Proprietario p : this.proprietariosSelected) {
            p.setEndereco(new Endereco(this.imovel.getEnderecoImovel()));
        }

        endPropChange = true;
        atualizar();
    }

    public boolean enderecoPreenchido(Endereco endereco) {
        if (endereco != null && ((endereco.getCep() != null)
                || (endereco.getLogradouro() != null && endereco.getBairroDne() != null))
                && endereco.getNumero() != null) {
            return true;
        }
        return false;
    }

    private boolean enderecoIgual(Endereco end1, Endereco end2) {
        if ((end1.getBairroDne() != null
                && end2.getBairroDne() != null
                && !end1.getBairroDne().equals(end2.getBairroDne()))
                || ((end1.getBairroDne() == null
                && end2.getBairroDne() != null))
                || (end2.getBairroDne() == null
                && end1.getBairroDne() != null)) {
            return false;
        }

        if ((end1.getLogradouro() != null
                && end2.getLogradouro() != null
                && !end1.getLogradouro().equals(end2.getLogradouro()))
                || ((end1.getLogradouro() == null
                && end2.getLogradouro() != null))
                || (end2.getLogradouro() == null
                && end1.getLogradouro() != null)) {
            return false;
        }

        if ((end1.getCep() != null
                && end2.getCep() != null
                && !end1.getCep().equals(end2.getCep()))
                || ((end1.getCep() == null
                && end2.getCep() != null))
                || (end2.getCep() == null
                && end1.getCep() != null)) {
            return false;
        }

        if ((end1.getNumero() != null
                && end2.getNumero() != null
                && !end1.getNumero().equals(end2.getNumero()))
                || ((end1.getNumero() == null
                && end2.getNumero() != null))
                || (end2.getNumero() == null
                && end1.getNumero() != null)) {
            return false;
        }

        if ((end1.getCompl() != null
                && end2.getCompl() != null
                && !end1.getCompl().equals(end2.getCompl()))
                || ((end1.getCompl() == null
                && end2.getCompl() != null))
                || (end2.getCompl() == null
                && end1.getCompl() != null)) {
            return false;
        }

        return true;
    }

    public void cancelarEnderecoPropDlg() {
        this.proprietariosSelected = null;
        this.endPropChange = true;
        atualizar();
    }

    public void setDimensaoFrente() {
        this.imovel.setFrenteRua(this.frente);
    }

    public void setDimensaoLadoDireito() {
        this.imovel.setLadoDireitoRua(this.ladoDireito);
    }

    public void setDimensaoLadoEsquerdo() {
        this.imovel.setLadoEsquerdoRua(this.ladoEsquerdo);
    }

    public Proprietario getProprietario() {
        return proprietario;
    }

    public void setProprietario(Proprietario proprietario) {
        this.proprietario = proprietario;
    }

    public List<Parentesco> getParentesco() {
        List<Parentesco> items = Arrays.asList(Parentesco.values());
        return items;
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel editImovel) {
        this.imovel = editImovel;
    }

    public LatLng getLatlong() {
        return latlong;
    }

    public void setLatlong(LatLng latlong) {
        this.latlong = latlong;
    }

    public Coordenada getCoordenada() {
        return coordenada;
    }

    public void setCoordenada(Coordenada coordenada) {
        this.coordenada = coordenada;
    }

    public MapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(MapModel mapModel) {
        this.mapModel = mapModel;
    }

    public String getConvN() {
        return convN;
    }

    public void setConvN(String convN) {
        this.convN = convN;
    }

    public String getConvE() {
        return convE;
    }

    public void setConvE(String convE) {
        this.convE = convE;
    }

    public String getConvZona() {
        return convZona;
    }

    public void setConvZona(String convZona) {
        this.convZona = convZona;
    }

    public Coordenada getEditarCoordenada() {
        return editarCoordenada;
    }

    public void setEditCoordenada(Coordenada editCoordenada) {
        this.editarCoordenada = editCoordenada;
    }

    public Coordenada getVisualizarCoordenada() {
        return visualizarCoordenada;
    }

    public void setVisuCoordenada(Coordenada visualizarCoordenada) {
        this.visualizarCoordenada = visualizarCoordenada;
    }

    public List<Anexo> getAnnexCroquis() {
        return annexCroquis;
    }

    public void setAnnexCroquis(List<Anexo> annexCroquis) {
        this.annexCroquis = annexCroquis;
    }

    public Anexo getAnnexCroqui() {
        return annexCroqui;
    }

    public void setAnnexCroqui(Anexo annexCroqui) {
        this.annexCroqui = annexCroqui;
    }

    public Proprietario getMorador() {
        return morador;
    }

    public void setMorador(Proprietario morador) {
        this.morador = morador;
    }

    public boolean isDisableInputsMorador() {
        return disableInputsMorador;
    }

    public void setDisableInputsMorador(boolean disableInputsMorador) {
        this.disableInputsMorador = disableInputsMorador;
    }

    public boolean isDisableEnderecoImovel() {
        return disableEnderecoImovel;
    }

    public void setDisableEnderecoImovel(boolean disableEnderecoImovel) {
        this.disableEnderecoImovel = disableEnderecoImovel;
    }

    public boolean isDisableEnderecoCorrespondencia() {
        return disableEnderecoCorrespondencia;
    }

    public void setDisableEnderecoCorrespondencia(boolean disableEnderecoCorrespondencia) {
        this.disableEnderecoCorrespondencia = disableEnderecoCorrespondencia;
    }

    public String getVisaoInscricao() {
        return visaoInscricao;
    }

    public void setVisaoInscricao(String visaoInscricao) {
        this.visaoInscricao = visaoInscricao;
    }

    public String getCenter() {
        return center;
    }

    public void setCenter(String center) {
        this.center = center;
    }

    public boolean isUsarMesmoEndereco() {
        return usarMesmoEndereco;
    }

    public void setUsarMesmoEndereco(boolean usarMesmoEndereco) {
        this.usarMesmoEndereco = usarMesmoEndereco;
    }

    public boolean isConnect() {
        return connect;
    }

    public void setConnect(boolean isConnect) {
        this.connect = isConnect;
    }

    public Anexo getAnexo() {
        return anexo;
    }

    public void setAnexo(Anexo anexo) {
        this.anexo = anexo;
    }

    public Anexo getRemoverCroqui() {
        return removerCroqui;
    }

    public void setRemoverCroqui(Anexo removerCroqui) {
        this.removerCroqui = removerCroqui;
    }

    public Integer getZoom() {
        return zoom;
    }

    public void setZoom(Integer zoom) {
        this.zoom = zoom;
    }

    public Coordenada getCoordenadaRemover() {
        return coordenadaRemover;
    }

    public void setCoordenadaRemover(Coordenada coordenadaRemover) {
        this.coordenadaRemover = coordenadaRemover;
    }

    public Proprietario getProprietarioVisualizar() {
        return proprietarioVisualizar;
    }

    public void setProprietarioVisualizar(Proprietario proprietarioVisualizar) {
        this.proprietarioVisualizar = proprietarioVisualizar;
    }

    public String getLadoEsquerdo() {
        return ladoEsquerdo;
    }

    public void setLadoEsquerdo(String ladoEsquerdo) {
        this.ladoEsquerdo = ladoEsquerdo;
    }

    public String getLadoDireito() {
        return ladoDireito;
    }

    public void setLadoDireito(String ladoDireito) {
        this.ladoDireito = ladoDireito;
    }

    public String getFrente() {
        return frente;
    }

    public void setFrente(String frente) {
        this.frente = frente;
    }

    public Proprietario getInquilino() {
        return inquilino;
    }

    public void setInquilino(Proprietario inquilino) {
        this.inquilino = inquilino;
    }

    public Endereco getEndPropNovo() {
        return endPropNovo;
    }

    public void setEndPropNovo(Endereco endPropNovo) {
        this.endPropNovo = endPropNovo;
    }

    public boolean isEndPropChange() {
        return endPropChange;
    }

    public void setEndPropChange(boolean endPropChange) {
        this.endPropChange = endPropChange;
    }

    public List<Proprietario> getProprietariosSelected() {
        return proprietariosSelected;
    }

    public void setProprietariosSelected(List<Proprietario> proprietariosSelected) {
        this.proprietariosSelected = proprietariosSelected;
    }

    public MapModel getMapModelDimensao() {
        return mapModelDimensao;
    }

    public void setMapModelDimensao(MapModel mapModelDimensao) {
        this.mapModelDimensao = mapModelDimensao;
    }

    public Integer getZoomDimensao() {
        return zoomDimensao;
    }

    public void setZoomDimensao(Integer zoomDimensao) {
        this.zoomDimensao = zoomDimensao;
    }

    public String getCenterDimensao() {
        return centerDimensao;
    }

    public void setCenterDimensao(String centerDimensao) {
        this.centerDimensao = centerDimensao;
    }

    public boolean isEditandoCoordenada() {
        return editandoCoordenada;
    }

    public void setEditandoCoordenada(boolean editandoCoordenada) {
        this.editandoCoordenada = editandoCoordenada;
    }

    private void atualizarMarkerCoordenadaDimensao(Marker marker) {

        for (Marker m : this.mapModelDimensao.getMarkers()) {
            if (marker.getId().equals(m.getId())) {
                m.setLatlng(marker.getLatlng());
                m.setData(marker.getData());
                break;
            }
        }

        this.polygon = new Polygon();

        List<Marker> markers = this.mapModelDimensao.getMarkers();

        this.mapModelDimensao = new DefaultMapModel();

        for (Marker m : markers) {
            addOverlayToMapModel(m);
        }

        this.mapModelDimensao.addOverlay(this.polygon);

        for (Marker premarker : this.mapModelDimensao.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    private boolean validarCoordenada() {

        boolean valida = true;

        if (this.coordenada.getConvN() == null || this.coordenada.getConvN().isEmpty()) {
            Msg.messagemError("O campo N é obrigatório !");
            valida = false;
        }
        if (this.coordenada.getConvE() == null || this.coordenada.getConvE().isEmpty()) {
            Msg.messagemError("O campo E é obrigatório !");
            valida = false;
        }

        if (!valida) {
//            RequestContext.getCurrentInstance().execute("required(true)");
        }

        return valida;
    }

    public List<Bairro> autocompleteBairroFaceQuadra(String bairro) {
        Long s = Long.parseLong(this.imovel.getInscricaoCadastralS().toString());
        Long q = Long.parseLong(this.imovel.getInscricaoCadastralQuadra().toString());
        return this.faceQuadraServico.autocompleteBairroSetorQuadra(s, q, bairro);
    }

    public List<FaceQuadra> autocompleteFaceQuadra(String logradouro) {
        Long s = Long.parseLong(this.imovel.getInscricaoCadastralS().toString());
        Long q = Long.parseLong(this.imovel.getInscricaoCadastralQuadra().toString());
        List<FaceQuadra> fqs = this.faceQuadraServico.autocompleteFaceQuadraBairroSetorQuadra(s, q, bairro, logradouro);
        if (this.imovel.getFaceQuadras() != null) {
            fqs.removeAll(this.imovel.getFaceQuadras());
        }
        return fqs;
    }

    public void addFaceQuadra() {
        if (this.faceQuadra != null) {
            if (this.imovel.getFaceQuadras() == null) {
                this.imovel.setFaceQuadras(new ArrayList<FaceQuadra>());
            }
            this.imovel.getFaceQuadras().add(faceQuadra);
            limparFaceQuadra();
        }
    }

    public void removerFaceQuadra(FaceQuadra fq) {
        this.imovel.getFaceQuadras().remove(fq);
    }

    public void limparFaceQuadra() {
        this.bairro = null;
        this.faceQuadra = null;
    }

    public boolean getPanelCollapsed() {
        return panelCollapsed;
    }

    public void setPanelCollapsed(boolean panelCollapsed) {
        this.panelCollapsed = panelCollapsed;
    }

    public FaceQuadra getFaceQuadra() {
        return faceQuadra;
    }

    public void setFaceQuadra(FaceQuadra faceQuadra) {
        this.faceQuadra = faceQuadra;
    }

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }
}
